package com.taoge.p4.common.interceptor;


import com.taoge.p4.common.annotation.Guest;
import com.taoge.p4.common.annotation.NotSign;
import com.taoge.p4.common.constants.GlobalConstants;
import com.taoge.p4.common.constants.UserContext;
import com.taoge.p4.common.constants.UserInfo;
import com.taoge.p4.common.exception.TokenException;
import com.taoge.p4.common.utils.CookieUtil;
import com.taoge.p4.common.utils.TokenUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.HandlerMethod;

@Configuration
@Slf4j
public class ApiInterceptor extends BaseInterceptor {
    @Override
    void validateToken(HttpServletRequest request, HandlerMethod handlerMethod) {
        String token = CookieUtil.getCookieByName(request, GlobalConstants.TOKEN);
        Long userId;
        UserInfo userInfo = new UserInfo();

        if (token != null) {
            // 解密token，得到用户id
            userId = TokenUtil.parseToken(token);
            log.info("userId = {}", userId);

            userInfo.setId(userId);
            UserContext.set(userInfo);
        }

        // 指定不需要校验token的接口，例如：登录接口
        NotSign notSign = handlerMethod.getMethodAnnotation(NotSign.class);
        if (notSign != null) {
            return;
        }

        if (token == null) {
            // 和前端约定了错误码，如果是返回406，需要前端自动调用一次 /api/getToken 获取游客身份
            throw new TokenException(406, "身份不正确");
        }

        // 指定不需要校验token的接口，例如：登录接口
        Guest guest = handlerMethod.getMethodAnnotation(Guest.class);
        if (guest == null && userInfo.isGuest()) {
            throw new TokenException("请登录");
        }

    }

    @Override
    void doAfterCompletion() {
        UserContext.remove();
    }

}
